#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//int removeElement(int* nums, int numsSize, int val) {
//    int src = 0;
//    int dst = 0;
//    while (src < numsSize)
//    {
//        if (nums[src] != val)
//        {
//            nums[dst++] = nums[src++];
//        }
//        else
//        {
//            src++;
//        }
//    }
//    return dst;
//}

//
//int removeDuplicates(int* nums, int numsSize) {
//    int src = 0;
//    int dst = 0;
//    while (src < numsSize - 1)
//    {
//        if (nums[src] != nums[src + 1])
//        {
//            nums[dst++] = nums[src++];
//        }
//        else
//        {
//            src++;
//        }
//    }
//    nums[dst++] = nums[src++];
//    return dst;
//}
#include<stdlib.h>
int main()
{
    int m = 3;
    int n = 3;
    int nums1[] = {1, 2, 9, 0, 0, 0};
    int nums2[] = { 2, 5, 6 };
    int* tmp = (int* )malloc((m + n) * sizeof(int));
    if (tmp == NULL)
    {
        perror("malloc");
        return 0;
    }
    int src = 0;
    int dst = 0;
    int min = 0;
    int cnt = 0;
    while (src + dst < m + n)
    {
        if (src < m && dst < n)
        {
            min = nums1[src] <= nums2[dst] ? nums1[src] : nums2[dst];
            tmp[cnt++] = min;
            if (min == nums1[src])
            {
                src++;
            }
            else
            {
                dst++;
            }
        }
        if (src == m)
        {
            tmp[cnt] = nums2[dst];
            cnt++;
            if (dst < n - 1)
            {
                dst++;
            }
            else
            {
                src++;
            }
        }
        else if(dst == n)
        {
            tmp[cnt] = nums1[src];
            cnt++;
            src++;
        }
    }
    for (cnt = 0; cnt < m + n; cnt++)
    {
        nums1[cnt] = tmp[cnt];
    }
    for (cnt = 0; cnt < m + n; cnt++)
    {
        printf("%d ", nums1[cnt]);
    }
    free(tmp);
    tmp = NULL;
    return 0;
}
//int Sort(const void* ptr1, const void* ptr2)
//{
//    return *(int*)ptr1 - *(int*)ptr2;
//}
//
//void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
//    for (int i = m; i < m + n; i++)
//    {
//        nums1[i] = nums2[i - m];
//    }
//    qsort(nums1, m + n, sizeof(int), Sort);
//}

//int Sort(const void* ptr1, const void* ptr2)
//{
//    return *(int*)ptr1 - *(int*)ptr2;
//}
//
//void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
//    for (int i = m; i < m + n; i++)
//    {
//        nums1[i] = nums2[i - m];
//    }
//    qsort(nums1, m + n, sizeof(int), Sort);
//}
//
//void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
//    int src = m - 1;
//    int dst = n - 1;
//    int tmp = 0;
//    int cnt = m + n - 1;
//    while (src >= 0 || dst >= 0)
//    {
//        if (src == -1)
//        {
//            tmp = nums2[dst--];
//        }
//        else if (dst == -1)
//        {
//            tmp = nums1[src--];
//        }
//        else if (nums2[dst] > nums1[src])
//        {
//            tmp = nums2[dst--];
//        }
//        else
//        {
//            tmp = nums1[src--];
//        }
//        nums1[cnt--] = tmp;
//    }
//
//}
//
//void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
//    int tmp[m + n];
//    int src = 0;
//    int dst = 0;
//    int mid = 0;
//    while (src < m || dst < n)
//    {
//        if (src == m)
//        {
//            mid = nums2[dst++];
//        }
//        else if (dst == n)
//        {
//            mid = nums1[src++];
//        }
//        else if (nums1[src] < nums2[dst])
//        {
//            mid = nums1[src++];
//        }
//        else {
//            mid = nums2[dst++];
//        }
//        tmp[src + dst - 1] = mid;
//    }
//    for (int i = 0; i < m + n; i++)
//    {
//        nums1[i] = tmp[i];
//    }
//}